//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

// #include <buola/buola.h>
// 
// #if BUOLA_PLATFORM_LINUX
// 
// #include <buola/app/ceventloop.h>
// 
// #include "cinotifymonitor.h"
// 
// #include <buola/io/cfdpoller.h>
// #include <buola/io/cdir.h>
// 
// #include <sys/inotify.h>
// #include <sys/ioctl.h>
// 
// namespace buola {
// 
// ////////////////////////////////////////////////////
// ///////  Class CINotifyMonitor::SConnection  ///////
// ////////////////////////////////////////////////////
// 
// class CINotifyMonitor::SConnection : CFDListener
// {
// public:
// ////////////////////////////////
// // constructor and destructor
// //
//     SConnection();
//     virtual ~SConnection();
// 
//     void OnFDListener(int,io::ENotify,void*);
// 
//     int mFD;
// };
// 
// ////////////////////////////////////////////////
// ///////  Class CINotifyMonitor::SConnection  ///////
// ////////////////////////////////////////////////
// 
// CINotifyMonitor::SConnection::SConnection()
//     :	mFD(inotify_init())
// {
//     get_main_fd_poller().AddFDListener(this,mFD,io::NOTIFY_READ);
// }
// 
// CINotifyMonitor::SConnection::~SConnection()
// {
//     close(mFD);
// }
// 
// void CINotifyMonitor::SConnection::OnFDListener(int,io::ENotify,void*)
// {
//     int lBytes;
//     ioctl(mFD,FIONREAD,&lBytes);
//     char lBuffer[lBytes];
//     lBytes=read(mFD,lBuffer,lBytes);
// 
//     struct inotify_event *lEvent;
//     char *lPos=lBuffer;
// 
//     while(lBytes>0)
//     {
//         lEvent=(inotify_event*)lPos;
//         CINotifyMonitor *lMonitor=mWatches[lEvent->wd];
//         if(lEvent->mask&(IN_CREATE|IN_MOVED_TO))
//         {
//             lMonitor->mDir->FAMCreated(lEvent->name);
//         }
//         if(lEvent->mask&IN_MODIFY)
//         {
//             lMonitor->mDir->FAMChanged(lEvent->name);
//         }
//         if(lEvent->mask&(IN_DELETE|IN_MOVED_FROM))
//         {
//             lMonitor->mDir->FAMDeleted(lEvent->name);
//         }
//         lBytes-=sizeof(inotify_event)+lEvent->len;
//         lPos+=sizeof(inotify_event)+lEvent->len;
//     }
// }
// 
// ///////////////////////////////////
// ///////  Class CINotifyMonitor  ///////
// ///////////////////////////////////
// 
// CINotifyMonitor::SConnection *CINotifyMonitor::mConnection=nullptr;
// bool CINotifyMonitor::mStaticInit=false;
// mutex CINotifyMonitor::mStaticMutex;
// std::unordered_map<int,CINotifyMonitor*> CINotifyMonitor::mWatches;
// 
// CINotifyMonitor::CINotifyMonitor(CDir *pDir)
//     :	mDir(pDir),
//         mInit(false)
// {
// }
// 
// CINotifyMonitor::~CINotifyMonitor()
// {
//     if(mInit) Cancel();
// }
// 
// void CINotifyMonitor::Start()
// {
//     lock_guard<mutex> lLock(mStaticMutex);
// 
//     if(!mStaticInit) InitStatic();
//     mWatchID=inotify_add_watch(mConnection->mFD,mDir->GetURL().GetFullPath().c_str(),
//                 IN_DELETE|IN_CREATE|IN_MODIFY|IN_MOVED_TO|IN_MOVED_FROM);
//     mWatches[mWatchID]=this;
// }
// 
// void CINotifyMonitor::Cancel()
// {
//     lock_guard<mutex> lLock(mStaticMutex);
// 
//     if(!mInit) return;
//     inotify_rm_watch(mConnection->mFD,mWatchID);
//     mWatches.erase(mWatchID);
// }
// 
// void CINotifyMonitor::InitStatic()
// {
//     if(mStaticInit) return;
//     mConnection=new SConnection;
//     mStaticInit=true;
// }
// 
// /*namespace buola*/ }
// 
// #endif //BUOLA_PLATFORM_LINUX
